package com.woniu.teachmall.service;

import com.woniu.teachmall.entity.Admin;
import com.woniu.teachmall.entity.User;
import com.woniu.teachmall.mapper.AdminMapper;
import com.woniu.teachmall.mapper.UserMapper;
import com.woniu.teachmall.service.login.LoginStrategy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.DigestUtils;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.math.BigDecimal;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.time.LocalDateTime;
import java.util.UUID;

/**
 * 用户综合服务实现
 * 提供用户注册、登录、状态管理及文件上传等核心功能
 */
@Service
public class UserService {
    // 用户数据访问接口
    @Autowired
    private UserMapper userMapper;

    // 管理员数据访问接口
    @Autowired
    private AdminMapper adminMapper;

    // 登录策略接口（策略模式实现）
    @Autowired
    private LoginStrategy loginStrategy;

    /**
     * 用户登录认证（策略模式实现）
     * @param account 登录账号
     * @param password 明文密码
     * @return 认证成功的用户实体
     */
    public User login(String account, String password) {
        System.out.println("策略模式实现登录");
        return loginStrategy.login(account, password);
    }

    /**
     * 用户注册流程
     * @param account 用户账号
     * @param password 明文密码
     * @param telphone 联系电话
     * @param email 电子邮箱
     * @param avatar 头像文件
     * @return 注册是否成功
     * @throws IOException 文件操作异常
     */
    public boolean insertUser(String account, String password, String telphone,
                              String email, MultipartFile avatar) throws IOException {
        // 账号唯一性校验
        User curUser = userMapper.getUserByAccount(account);
        if (curUser != null) {
            return false;
        }

        // 构建用户实体
        User newUser = new User();
        newUser.setAccount(account);
        newUser.setPassword(DigestUtils.md5DigestAsHex(password.getBytes())); // MD5加密
        newUser.setTelphone(telphone);
        newUser.setEmail(email);
        String avatarPath = saveAvatar(avatar); // 保存头像文件
        newUser.setAvatar(avatarPath);
        newUser.setPoints(0);
        newUser.setMoney(BigDecimal.valueOf(0.0));
        newUser.setRegTime(LocalDateTime.now());
        newUser.setStatus("Y"); // 初始状态为正常

        // 执行数据库插入操作
        return userMapper.insert(newUser) > 0;
    }

    /**
     * 头像文件存储服务
     * @param file 上传的头像文件
     * @return 头像访问路径
     * @throws IOException 文件操作异常
     * @throws IllegalArgumentException 不支持的图片格式
     */
    private String saveAvatar(MultipartFile file) throws IOException {
        // 文件格式校验
        String originalName = file.getOriginalFilename();
        String fileExt = originalName.substring(originalName.lastIndexOf("."));
        if (!fileExt.equalsIgnoreCase(".jpg") &&
                !fileExt.equalsIgnoreCase(".jpeg") &&
                !fileExt.equalsIgnoreCase(".png")) {
            throw new IllegalArgumentException("仅支持JPEG/JPG/PNG格式");
        }

        // 生成唯一文件名
        String fileName = UUID.randomUUID() + fileExt;

        // 配置存储路径
        String uploadDir = "src/main/webapp/static/upload/avatar/";
        Path uploadPath = Paths.get(uploadDir);

        // 创建目录（如果不存在）
        if (!Files.exists(uploadPath)) {
            Files.createDirectories(uploadPath);
        }

        // 保存文件到本地
        Path filePath = uploadPath.resolve(fileName);
        Files.copy(file.getInputStream(), filePath, StandardCopyOption.REPLACE_EXISTING);

        return "/static/upload/avatar/" + fileName; // 返回Web访问路径
    }

    /**
     * 冻结用户账号
     * @param id 用户ID
     */
    @Transactional
    public boolean freezeUser(Integer id) {
        return userMapper.updateUserStatus(id, "2") > 0; // 状态码2表示冻结
    }

    /**
     * 解冻用户账号
     * @param id 用户ID
     */
    @Transactional
    public boolean unfreezeUser(Integer id) {
        return userMapper.updateUserStatus(id, "0") > 0; // 状态码0表示正常
    }

    /**
     * 用户登出操作
     * @param id 用户ID
     */
    public boolean logout(Integer id) {
        return userMapper.updateUserStatus(id, "0") > 0;
    }

    /**
     * 加入黑名单
     * @param id 用户ID
     */
    @Transactional
    public boolean addToBlacklist(Integer id) {
        return userMapper.updateBlacklistStatus(id, "3") > 0; // 状态码3表示黑名单
    }

    /**
     * 移出黑名单
     * @param id 用户ID
     */
    @Transactional
    public boolean removeFromBlacklist(Integer id) {
        return userMapper.updateBlacklistStatus(id, "0") > 0;
    }

    /**
     * 永久删除用户记录
     * @param id 用户ID
     */
    @Transactional
    public boolean deleteUser(Integer id) {
        return userMapper.deleteUser(id) > 0;
    }
}